import java.io.File; // Импортируем класс для работы с файловой системой


import Find.FindFiles;
import Mask.MaskFilter;


public class Dir {
	public static void main(String[] args) {
	
		FindFiles find = new FindFiles();
		MaskFilter filter;
		
		/*for (short i = 0; i < args.length; i++) {
			System.out.println("args[" + i + "] = " + args[i]);
		}*/
	
		boolean mask = false; // вспомогательные переменные
		boolean regular = false;
		String path = new String("."); // просматриваемая директория (по умолчанию текущая)
		
		try {
			for (short i = 0; i < args.length; i++) {
				if (args[i].charAt(0) == '-') {
					if (args[i].length() > 2) // Комбинированные и длинные ключи запрещены (пока)
						throw new IllegalAccessException("Invalid command line optinons.");
				
					switch(args[i].charAt(1)) {
					case 'R':
						find.recursive = true; // Рекурсивный вывод
						break;
					case 'a':
						find.atributes = true; // Вывод атрибутов файла
						break;
					case 'm': {
						if (regular) // маска и регэксп не могут быть заданы одновременно
							throw new IllegalAccessException("keys \"-r\" and \"-m\" can not be specified together.");
						
						mask = true;	  // Маска вывода файлов
						
						String _mask = new String(args[++i]);
						
						if (_mask.charAt(0) == '-') // Следующий аргумент - ключ, а должна быть маска
							throw new IllegalAccessException("Invalid command line optinons. Options \"-m\" or \"-r\" requires an argument.\n");
						
						if (_mask.indexOf('/') >= 0)
							throw new IllegalAccessException("Mask can not contain the character \"/\".");
						
						filter = new MaskFilter(); // Выделяем память под объект MaskFilter
						
						find.pmask = filter;	// Передаём ссылку на объект filter в объект find
						filter.maskToRegExp(_mask); // Передаём маску
						break;
						}
					case 'r': {
						if (mask) // маска и регэксп не могут быть заданы одновременно
							throw new IllegalAccessException("keys \"-r\" and \"-m\" can not be specified together.");
						regular = true;
						
						String _regexp = new String(args[++i]);
						
						if (_regexp.charAt(0) == '-') // Если ключ задан, а параметр - нет
							throw new IllegalAccessException("Invalid command line optinons. Options \"-m\" or \"-r\" requires an argument.\n");
						
						filter = new MaskFilter(); // Выделяем память под объект MaskFilter
						filter.regExp(_regexp); // Передаём регулярное выражение в объект find
						
						find.pmask = filter;	// Передаём ссылку на объект filter в объект find
						break;
						}
					case 'd':
						path = args[++i]; // Просматриваемая директория
						if (!(new File(path).exists())) // После ключа -p должен следовать адрес директории
							throw new IllegalAccessException("Invalid command line optinons.");
						break;
					case 'h':
						help();	// справка
						return;
					default:
						System.err.println("Error! \""+ args[i] + "\": unknown key." );
						throw new IllegalAccessException("Invalid command line optinons."); // Задан неизвестный ключ
					}
				} else {
					// Неверно заданы ключи
					throw new IllegalAccessException("Invalid command line optinons.");
				}
			}
			
			find.contentDirectory(new File(path).getAbsoluteFile());
			
		} catch (NullPointerException e) {
			System.err.println("Error! \"" + path + "\": no access, or path not found.\n");
		} catch (IllegalAccessException e) {
			System.err.println("Error! " + e + "\n");
			help();
		} catch (StringIndexOutOfBoundsException e) {
			System.err.println("Error! " + e + "\n");
			help();
		} catch (ArrayIndexOutOfBoundsException e) {
			System.err.println("Error! Invalid command line optinons. Options \"-m\" or \"-r\" requires an argument.\n");
			help();
		}
	}
	
	// Справка относится только к данной программе, поэтому она принадлежит главному классу
	private static void help () {
		System.out.println("Using: Dir [KEY]... [FILE]...\n"+
			"List  information  about  the FILEs (the current directory by default).\n"+
			"Sort entries alphabetically.\n\n"+

			"List KEYs:\n"+
			"\t-a\tattributes of the file (fullname, date of last change, etc)\n"+
			"\t-d\tpath to directorty\n"+
			"\t-h\tthis help\n"+
			"\t-m\toutput files by mask (NOT be used with \"-r\")\n"+
			"\t-r\toutput files bu regular expression (NOT be uset with \"-m\")\n"+
			"\t-R\tlist subdirectories recursively\n");
	}
} // class Dir




/*
class CommandLine {
/**
класс предназначен для грамотного разбора аргументов командной строки
Метод getopt возвращает короткие ключи
Метод getopt_long возвращает длинные ключи


	private int i;
	
	public String optarg; // аргумент текущего ключа (если он есть)
	
	private String optstr;// задаваемые (через конструктор) пользователем класса опции
	
	public int opterr;
	/** Коды ошибок:
	1 - неизвестный ключ;
	2 - задан длинный ключ;
	
	
	CommandLine(String _optstr) {
		i = 0;
		opterr = 0;
		optarg = new String();
		optstr = new String(_optstr);
	}
	
	public char getopt(String[] args) {
		for (; i < args.length; i++) {
			if (args[i].charAt(0) == '-') {
				if (args[i].length > 2) { 
					i++;
					opterr = 2;
					return (char) 0; // сообщаем о длинном ключе
				}
				
				char c = args[i].charAt(1);
				int index = optstr.indexOf(c);
				if (index > 0) { // аргумент задан
					if (optstr[index+1] == ':')  // если аргумент имеет ключ,
						optarg = args[++i].trim(); // то сохраняем его в поле optarg
					return c;	// возвращаем ключ
				} else {
					opterr = 1;
					return (char) 0; // ошибка
				}
			} else {
				continue; // параметры без символа "-" игнорируем
			}
		}
	}
	
	public String getopt_long (String[] args, String)
	
	/** Функция isOpt определяет, является ли введённая строка ключом
	public boolean isOpt (String opt) {
	
	}
	
} // class CommandLine */
